\documentclass{article}
\usepackage{ctex}
\usepackage{geometry}
\usepackage{ragged2e}
\usepackage{graphicx}
\usepackage{enumerate}
\usepackage{listings}
\usepackage{xcolor}
\lstset{
  basicstyle=\ttfamily\small,    % 等宽字体
  numbers=left,                   % 显示行号
  numberstyle=\tiny\color{gray},  % 行号样式
  frame=single,                   % 边框样式
  breaklines=true,                % 自动换行
  keywordstyle=\color{blue},      % 关键字颜色
  commentstyle=\color{green!40!black}, % 注释颜色
  stringstyle=\color{red}         % 字符串颜色
}
\geometry{a4paper,scale=0.7}
\title{LED实验报告}
\author{赵俊宇 PB24061271}
\date{2025.3.22}
\begin{document}
\maketitle
\tableofcontents
    \section{编程的心得体会}
    和普通的C程序不同,这次的MCU编程主要依赖于宏定义和位运算.
    
    为了实现呼吸灯,我采用了for循环嵌套,
    通过for循环,使得每次亮起时间由短变长,再由长变短,从而实现肉眼上的呼吸效果.
    \begin{lstlisting}[language=C]
        for (i=0;i<100;i++)
		{
			PORTB &=~(1<<PORTB2);
			for (j=0;j<i;j++)_delay_us(150);
			PORTB |=(1<<PORTB2);
			for(j=0;j<100-i;j++)_delay_us(150);
		}
		for(i=100;i>0;i--){
			PORTB &=~(1<<PORTB2);
			for (j=0;j<i;j++)_delay_us(150);
			PORTB |=(1<<PORTB2);
			for(j=0;j<100-i;j++)_delay_us(150);
		}
        \end{lstlisting}

        而后,引入触摸按键,触摸按键输出高电平,为了实现触摸按键切换LED的效果,我们引入counter计数器
        并使用tpr1和tpr2两个变量记录按键输出的电平状态,通过统计tpr1和tpr2的状态,实现对触摸次数的计数.
        \begin{lstlisting}[language=C]
            tpr2=tpr1;
		tpr1=(PIND & (1<<PIND4))>>4;
		if (tpr1==1 &&tpr2==0) counter++;
        \end{lstlisting}
        随后使用switch,就可以实现按次数切换LED.
        \begin{lstlisting}
            switch (counter){
			case 1: PORTB &=~(1<<PORTB1);PORTB|=(1<<PORTB2);PORTB|=(1<<PORTB3);break;
			case 2: PORTB &=~(1<<PORTB2);PORTB|=(1<<PORTB1);PORTB|=(1<<PORTB3);break;
			case 3: PORTB &=~(1<<PORTB3);PORTB|=(1<<PORTB2);PORTB|=(1<<PORTB1);break;
			default: PORTB |=(1<<PORTB1)|(1<<PORTB2)|(1<<PORTB3);counter=0;
            }
        \end{lstlisting}
    \section{位运算反思}
    毫无疑问,位运算是MCU编程内不可或缺也略有繁琐的部分.这里以低电平LED为例,讲解位运算的意义.
    DDRX|=(1<<DDRXN)代表着将PXN改为高电平,并不改变其他位;DDRX \&=~(1<<DDRXN)则代表着将PXN改为低电平而不改变其他位.
    如果需要同时改变多位,则需将上面的代码用位运算符号"|"和"\&"连接.

    在这次实验中,所有元器件状态的控制都依赖于高低电平的输入与输出,这个过程中一定离不开位运算的参与.因此,
    熟练掌握并运用位运算是编程中不可或缺的重要步骤.

        最后,一定要正确判断元件,明白它正确的连接方式和连接规则
    \paragraph{}  

    \hfill 赵俊宇

    \hfill PB24061271
\end{document}